﻿using System;
using System.Collections.Generic;
using TPDiseño.Clases_de_Entidad;
using DAO.DataSetConsultoraTableAdapters;

namespace DAO
{
    public class DAOFactor : DAO
    {
        //Atributos de manejo de instancia (singleton)
        static DAOFactor instance = null; 
        // Atributos para acceso a los DataSet Tipados
        private DataSetConsultora.FactorDataTable FactorTabla = new DataSetConsultora.FactorDataTable();
        private FactorTableAdapter FactorTableAdapter = new FactorTableAdapter();
        // Dependencias de otros DAOs
        private DAOPregunta miDAOPregunta = DAOPregunta.Instance;

        public static DAOFactor Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new DAOFactor();
                        }
                    }
                }
                return instance;
            }
        }

        public Factor guardar(Factor unFactor, int id_competencia)
        {

            FactorTableAdapter.Insertar(unFactor.nombre, unFactor.descripcion, id_competencia);

            return recolectarUno();
        }

        public List<Factor> cargar(Factor unaFactor)
        {

            // Cargo los Factor de la db
            FactorTabla = FactorTableAdapter.GetData();

            // Finalmente devuelvo la lista de factorsCargados, recolectadas por la funcion            
            return recolectar();
        }

        public List<Factor> cargar(Int32 cod_Competencia)
        {
            // obtengo el Factor por id en empresaTabla
            FactorTabla = FactorTableAdapter.consultarPor(cod_Competencia);

            // Finalmente devuelvo la lista de factorsCargados, recolectadas por la funcion            
            return recolectar();
        }

        private List<Factor> recolectar()
        {

            // Creo la lista para recolectar y devolver los factors cargados de la db
            List<Factor> factorsCargados = new List<Factor>();

            // Recorro los factors de la tabla
            foreach (DataSetConsultora.FactorRow unaFactorFila in FactorTabla)
            {

                // Creo un factor y lo agrego a la lista de factors cargados
                factorsCargados.Add(new Factor(unaFactorFila.id,
                                               unaFactorFila.nombre,
                                               "",
                                               miDAOPregunta.cargar(unaFactorFila.id)
                                               )
                                    );

            }

            return factorsCargados;
        }
        
        public Factor recolectarUno()
        {

            // Finalmente retorno un nuevo objeto Empresa mapeado de la tabla
            return new Factor(FactorTabla[0].id,
                              FactorTabla[0].nombre,
                              "",
                              miDAOPregunta.cargar(FactorTabla[0].id)
                              );


        }

    }
}
